IR Generation
- 中间表示(intermediate representation, IR)
- 编译器的 前端 进行 词法分析、语法分析 和 语义分析,并生成中间表示
- 编译器的 后端 进行优化,并将表示翻译成机器语言
中间表示树 IR Trees
- :“表达式”,表示为
- :“无结果语句”,表示为 语句
- :“条件语句”
static Tr_exp Tr_Ex(T_exp ex);
static Tr_exp Tr_Nx(T_stm nx);
static Tr_exp Tr_Cx(patchList trues, patchList falses, T_stm stm);
- :整型常数
- :符号常数
- :临时变量
- :对操作数 、 施加二元操作符 表示的操作
- :开始于存储地址 的 wordSize 个字节的内容
- :过程调用,以参数表 调用函数
- :先计算语句 以形成其副作用,然后计算 作为此表达式的结果
- :计算 并将结果送入临时单元
- :计算 ,由它生成地址 ,然后计算 ,并将计算结果存储在从地址 开始的 wordSize 个字节的存储单位中
- :计算 但忽略结果
- :依次计算 、,生成值 、,然后用关系操作符 比较 和 ;如果结果为 true,则跳转到 ,否则跳转到
- 关系操作符 可以是 LT、GT、LE、GE、EQ、NE...
- :语句 之后跟随语句
- :定义名字 的常数值为当前机器代码的地址
Three-address code
基本块和轨迹
Tree 语言表示的程序和机器语言程序之间存在如下不匹配的情况:
- 在表达式中使用 会使得转移与机器语言的规则不同
- 在表达式中使用 会使得子树的不同计算顺序产生不同结果
- 在表达式中使用 也会使得子树的不同计算顺序产生不同结果
- 在一个 结点的参数表达式中使用另一个 结点会出问题
对于任意一颗树,可以将它重写为等价的没有上述任何一种情况的树,转换过程分三步进行:
- 将一棵树重写成一列不含 和 结点的 规范树
- 将一列树分组组合成其内不含转移和标号的 基本块 集合
- 对基本块排序并形成一组 轨迹,轨迹中每一个 之后都直接跟随它的 false 标号
规范树 canonical tree
- 定义具有以下属性的树为规范树
- 无 或
- 每一个 的父亲不是 ,就是
ESEQ 的转换
将 CALL 移到顶层
的实现是将它的结果返回到同一个规定的返回值寄存器 中,所以像是 的语句都存在冲突,但是可以使用 重写规则 解决
- 对于 ,替换为
- 对于 ,不执行替换
- 对于 ,不执行替换
线性语句表
经过上述变换后,将得到一颗树 ,其中所有的 结点都集中在树的顶部,可以将类似 的表达式统一转化为 。最终 线性化 为如下形式的表达式:
因为 结点完全不提供结构化信息,因此可以认为它只是由语句组成的简单列表
基本块 basic block
- 基本块是语句组成的一个序列,需要满足以下条件
- 第一个语句是一个
- 最后一个语句是 或者
- 没有其他的 、 或者
- 可以按任意顺序安排基本块,并且程序执行的结果仍是相同的
轨迹 trace